大家好:
本文简单介绍一下用于权限控制的Spring boot拦截器配置,拦截器重定向问题。
开发工具:jdk1.8 idea2017(付费版,网上找的破解教程)
1,首先使用idea创建一个Spring boot+jsp的简单项目,结构目录如下:
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823154958199-3951568.png)
2.创建filter文件夹,在文件夹创建CheckFilter.java文件,继承拦截器基础接口HandlerInterceptor,并实现以下三个方法:
preHandle:核心方法,请求处理器,只有该方法返回true,才会继续执行后续的Controller。
postHandle:DispatcherServlet进行视图返回渲染之前进行调用
afterCompletion:在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823161117086-1011896032.png)
3,在filter文件中创建 WebMvcConfig.java文件,继承类 WebMvcConfigurationSupport(拦截器的配置类,主要配置拦截器的相关参数),并继承以下方法:
addInterceptors:添加拦截器实例
addResourceHandlers:静态文件访问配置
configureViewResolvers:视图配置
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823164122921-447293426.png)
4,最终代码展示
拦截器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.filter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CheckFilter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器访问方法:"+request.getServletPath());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
CheckFilter.java
拦截器配置类
因为WebMvcConfigurationSupport不走自动化的配置文件,所以一些静态文件,视图配置需要自己手动再添加一下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CheckFilter()).addPathPatterns("/**").
excludePathPatterns("/testBean/test");
super.addInterceptors(registry);
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/",".jsp");
super.configureViewResolvers(registry);
}
}
WebMvcConfig.java
addInterceptors(InterceptorRegistry registry):添加拦截器,并且配置拦截路径等参数
addInterceptor(new CheckFilter()):添加实例化的拦截器
addPathPatterns("/**") :配置拦截器拦截的路径
excludePathPatterns("/testBean/test"):配置不进去拦截器的方法,多少个就可以像这样儿在后面一直添加,excludePathPatterns("/testBean/test","","",........).
ddResourceHandlers(ResourceHandlerRegistry registry):静态文件访问配置
onfigureViewResolvers(ViewResolverRegistry registry):试图配置测试的bean
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("testBean")
public class TestBean {
@RequestMapping("testDemo")
public String TestDemo(){
return "hello";
}
@RequestMapping("test")
public String test(){
return "test";
}
}
TestBean.java
配置文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#访问相关配置
server.port=8080
server.tomcat.uri-encoding=UTF-8
#项目访问名称,如果不配置直接访问bean就可以
server.servlet.context-path=/springBoot_demo
#数据库配置
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL
spring.datasource.username=silver
spring.datasource.password=silver
#Spring boot视图配置
spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp
#静态文件访问配置
spring.mvc.static-path-pattern=/static/**
application.properties
两个简单jsp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Title
Hello,World!
hello.jsp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Title
拦截器访问!
test.jsp
4,开始测试代码
打开浏览器访问TestBean.java的第一方法
http://localhost:8080/springBoot_demo/testBean/testDemo
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823171129934-691172171.png)
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823171155175-1650439509.png)
出现访问拦截器的文字,测试成功
打开浏览器访问TestBean.java的第二方法,这个方法配置不走拦截器
http://localhost:8080/springBoot_demo/testBean/test
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823171438610-306708055.png)
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823171558053-1616886429.png)
如果进入拦截器应该会再多出现一行文字,没有出现第二行字代表着测试成功,没有进入拦截器
5.拦截器的重定向配置
关于这个重定向问题,在spring mvc中可以在拦截器中直接重定向到jsp中,例如这样儿:response.sendRedirect(request.getContextPath()+"/mainFunction/errorMsg.jsp");
但是spring boot这样写会报错,我在网上找了好多关于拦截器重定向文章,没有发现直接访问jsp的写法,都是一个方案,直接重定向到bean的方法,然后返回到你想要页面.
简单修改代码:
在CheckFilter.java的preHandle方法中添加两行:HttpSession seesion = request.getSession();response.sendRedirect(request.getContextPath()+"/testBean/test");在请求已经响应后创建seesion会后台报错,所以需要添加获取session,在请求结束前创建session
这个方案需要将/testBean/test配置为不进入拦截器,要不然就会是一个无限重定向的死循环。因为上面我已经将/testBean/test加入到不进去拦截器的配置中,所以WebMvcConfig.java就不需要再改了
修改后代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.example.filter;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CheckFilter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器访问方法:"+request.getServletPath());
response.sendRedirect(request.getContextPath()+"/testBean/test");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
CheckFilter.java
6.重启项目,测试重定向是否生效
打开浏览器继续访问TestBean.java的第一方法
http://localhost:8080/springBoot_demo/testBean/testDemo![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823173436578-1828970351.png)
![](https://images2018.cnblogs.com/blog/1438370/201808/1438370-20180823173530073-1651839176.png)
测试成功,正常进去test.jsp中
|